package com.hejing.project03_优尚开发团队人员调度系统.service;

import com.hejing.project03_优尚开发团队人员调度系统.domain.Architect;
import com.hejing.project03_优尚开发团队人员调度系统.domain.Designer;
import com.hejing.project03_优尚开发团队人员调度系统.domain.Employee;
import com.hejing.project03_优尚开发团队人员调度系统.domain.Programmer;

/**
 * ClassName: TeamService
 * Package: com.hejing.project03_优尚开发团队人员调度系统.service
 * Description:
 * 关于开发团队成员的管理: 添加、删除等
 *
 * @Author: HeJing
 * @Create: 2023-04-13 21:01
 * @Version: 1.0
 */
public class TeamService {

    // 属性
    private static int counter = 1;  // 给memberID 进行自动赋值的基数
    private final int MAX_MEMBER = 5;  // 表明当前开发团队的最大成员数

    private Programmer[] team = new Programmer[MAX_MEMBER];  // 开发团队数组

    private int total;  // 记录开发团队中真实的人数


    // 方法

    /**
     * 返回当前团队的所有对象。
     *
     * @return 包含所有成员对象的数组，数组大小与total一致
     */
    public Programmer[] getTeam() {
        Programmer[] team = new Programmer[total];
        for (int i = 0; i < total; i++) {
            team[i] = this.team[i];
        }
        return team;
    }

    /**
     * 向团队中添加成员
     *
     * @param e 待添加成员对象
     * @throws TeamException 添加失败，TeamException 中包含了失败的原因。
     */
    public void addMember(Employee e) throws TeamException {
        // 成员已满，无法添加
        if (total >= MAX_MEMBER) {
            throw new TeamException("成员已满，无法添加");
        }
        // 该成员不是开发人员，无法添加
        if (!(e instanceof Programmer)) {
            throw new TeamException("该成员不是开发人员，无法添加");
        }


        Programmer p = (Programmer) e;  // 为什么此处强转没有问题? 因为如该成员是 employee, 在上一个判断代码已经抛出去异常了。
        Status status = p.getStatus();

        switch (status) {
            case BUSY:
                // 该成员已经是某个团队的成员，无法添加
                throw new TeamException("该成员已经是某个团队的成员，无法添加");
            case VOCATION:
                // 该员工正在休假，无法添加
                throw new TeamException("该员工正在休假，无法添加");
        }

        // 该员工已在本开发团队中，无法添加
        boolean isExist = isExist(p);
        if (isExist) {
            throw new TeamException("该员工已在本开发团队中，无法添加");
        }
        // 团队中最多只能有一名架构师
        // 团队中最多只能两名设计师
        // 团队中最多只能有三名程序员。

        // 统计团队中程序员、设计师、架构师的人数
        int architectNum = 0;
        int designerNum = 0;
        int programmerNum = 0;
        for (int i = 0; i < total; i++) {
            if (team[i] instanceof Architect) {
                architectNum++;
            } else if (team[i] instanceof Designer) {
                designerNum++;
            } else {
                programmerNum++;
            }
        }
        if (p instanceof Architect) {
            if (architectNum > 0) throw new TeamException("团队中最多只能有一名架构师，无法添加");
        } else if (p instanceof Designer) {
            if (designerNum > 1) throw new TeamException("团队中最多只能两名设计师，无法添加");
        } else {
            if (programmerNum > 2) throw new TeamException("团队中最多只能有三名程序，无法添加");
        }

        // 可以进行添加操作:
        team[total++] = p;
        p.setMemberId(counter++);
        p.setStatus(Status.BUSY);
    }

    /**
     * 从团队中删除成员
     * @param memberId 待删除成员的 memberId
     * @throws TeamException 删除失败，找不到 memberId 的成员。
     */
    public void removeMember(int memberId) throws TeamException {
        int i;
        for(i = 0; i < total; i++) {
            if(team[i].getMemberId() == memberId) {
                // 找到了该团队成员
                // 调整该员工相关属性 (员工 memberId 可以不修改，反正每一次添加团队成员都会赋memberId新值)
                team[i].setStatus(Status.FREE);
                break;
            }
        }
        // 没找到该成员
        if(i == total) {
            throw new TeamException("查无此人，删除失败");
        }

        // 调整数组，进行逻辑删除
        for(int j = i; j < total - 1; j++) {
            team[j] = team[j + 1];
        }
        team[--total] = null;
    }

    /**
     * 判断对象p 是否已在当前的开发团队中。
     *
     * @param p 待判断对象 Programmer p
     * @return true or false
     */
    private boolean isExist(Programmer p) {
        for (int i = 0; i < total; i++) {
            if (p.getId() == team[i].getId()) {
                return true;
            }
        }
        return false;
    }


}
























